/*
 * Copyright (c) 2011, Nikolaus Moll
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * * Neither the name of the gradecalculator.net nor the
 *   names of its contributors may be used to endorse or promote products
 *   derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */
package net.gradecalculator.plugin.loader;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

import net.gradecalculator.plugin.loader.exceptions.PluginException;

public final class PluginLoader {
	private PluginLoader()
	{
	}
	
	public static String getResourceContents(final URLClassLoader loader, final String resource) {
		final InputStream stream = loader.getResourceAsStream(resource);
		final StringBuffer contents = new StringBuffer();
		BufferedReader reader = null;
		 
		try {
			reader = new BufferedReader(new InputStreamReader(stream));
			String text = null;

			while ((text = reader.readLine()) != null) {
				contents.append(text).append(System.getProperty("line.separator"));
			}
		} catch (final Exception e) {
			throw new PluginException("Cannot read resource: " + resource, e);
		} finally {
			try {
				if (reader != null) {
					reader.close();
				}
			//CHECKSTYLE:OFF
			} catch (final IOException e) {
			//CHECKSTYLE:ON
			}
		}

		return contents.toString().trim();
	}

	public static Object getPluginByResource(final File file, final String resource)  
	{
		try { 
			final URL pluginURL = file.toURI().toURL();
			final URLClassLoader loader = new URLClassLoader(new URL[] {pluginURL});
			final String className = getResourceContents(loader, resource);
			
			return loader.loadClass(className).newInstance();
		} catch (final MalformedURLException e) {
			throw new PluginException("Error loarding filename: " + file.getAbsolutePath(), e);
		} catch (final ClassNotFoundException e) {
			throw new PluginException("Error loarding plugin " + file.getAbsolutePath(), e);
		} catch (final InstantiationException e) {
			throw new PluginException("Error loarding plugin " + file.getAbsolutePath(), e);
		} catch (final IllegalAccessException e) {
			throw new PluginException("Error loarding plugin " + file.getAbsolutePath(), e);
		}
	}

	public static Object getPluginByResource(final String filename, final String resource)
	{
		final File file = new File(filename);
		return getPluginByResource(file, resource);
	}

}
